package scales.xml.impl
import scales.xml.{QName, Attributes, emptyAttributes, emptyNamespaces}
object DefaultHashes {
val emptyAttributesHash = emptyAttributes.hashCode
val emptyNamespacesHash = emptyNamespaces.hashCode
}
import DefaultHashes._
class ElemKey {
var name : QName = _
var nameHash : Int = 0
var attributes : Attributes = _
var namespaces : Map[String, String] = _
def set(name : QName, attributes : Attributes, namespaces : Map[String, String], nameHash : Int = 0) = {
this.name = name
this.attributes = attributes
this.namespaces = namespaces
if (nameHash == 0)
this.nameHash = name.hashCode
else
this.nameHash = nameHash
lastHash = 0
hashCode
this
}
def copy = {
val r = new ElemKey
r.name = name
r.attributes = attributes
r.namespaces = namespaces
r.lastHash = lastHash
r
}
override def equals( other : Any ) = other match {
case oq : ElemKey =>
if ((lastHash == oq.lastHash) &&
((name eq oq.name) || (name ==== oq.name)) &&
((attributes eq oq.attributes) || (attributes == oq.attributes)) &&
((namespaces eq oq.namespaces) || (namespaces == oq.namespaces))
)
true
else
false
case _ => scales.utils.error("Cannot compare an ElemKey to anything else other than a ElemKey")
}
var lastHash : Int = 0
override def hashCode() : Int = {
if (lastHash != 0) return lastHash
var hs = 1
hs = (hs * 31) + nameHash
hs = (hs * 31) + (
if (emptyAttributes eq attributes)
emptyAttributesHash
else
attributes.hashCode
)
hs = (hs * 31) + (
if (namespaces eq emptyNamespaces)
emptyNamespacesHash
else
namespaces.hashCode
)
lastHash = hs
hs
}
}
final class FullEqualQNameKey() {
var prefix : String = _
var local : String = _
var namespace : String = _
@inline def copy = {
val n = new FullEqualQNameKey()
n.prefix = prefix
n.local = local
n.namespace = namespace
n.lastHash = lastHash
n
}
@inline def set( qname : QName ) = {
prefix = qname.prefix.getOrElse(null:String)
local = qname.local
namespace = qname.namespace.uri
lastHash = 0
hashCode
this
}
@inline def setNoNamespaceQName( nlocal : String ) = {
prefix = null:String
local = nlocal
namespace = ""
lastHash = 0
hashCode
this
}
@inline def setUnprefixedQName( nlocal : String, nnamespace : String ) = {
prefix = null:String
local = nlocal
namespace = nnamespace
lastHash = 0
hashCode
this
}
@inline def setPrefixedQName( nlocal : String, nnamespace : String, nprefix : String ) = {
prefix = nprefix
local = nlocal
namespace = nnamespace
lastHash = 0
hashCode
this
}
def =:=( other : FullEqualQNameKey ) =
if (this eq other) true
else
(other.local == local && namespace == other.namespace)
override def equals( other : Any ) = other match {
case oq : FullEqualQNameKey =>
if (this eq oq) true
else
if ((oq.lastHash == lastHash) && (this =:= oq))
if ((oq.prefix ne null) && (prefix ne null))
prefix == oq.prefix
else
((oq.prefix eq null) && (prefix eq null))
else
false
case _ => error("Cannot compare a FullEqualQNameKey to anything else other than a FullEqualQNameKey")
}
var lastHash : Int = 0
override def hashCode() : Int = {
if (lastHash != 0) return lastHash
var hs = 1
hs = (hs * 31) + (
if (prefix eq null) 1
else prefix.hashCode
)
hs = (hs * 31) + local.hashCode
hs = (hs * 31) + namespace.hashCode
lastHash = hs
hs
}
}
<iframe src="https://scalesxml.github.io/scales-xml_2.10/0.5.0/api.sxr/scales/xml/impl/Keys.scala.html" width="1280" height="720" frameborder="0"> </iframe>